package main

import (
	"encoding/json"
	"fmt"
	"strconv"
	"time"
)

const userNamePre = "测试名称 c++/go/cangjie 编程语言 json序列化、反序列化性能大比拼 - "
const scoreBase float32 = 65.5
const ageBase int = 18

func main() {

	num := 1000000 // 初始化100万个对象 1000000
	var stuSlice = make([]Stu, num)
	InitStu(num, stuSlice)
	jsString := jsonEncode(stuSlice)
	var resp Response
	var err error
	// ↑↑↑  以上构建json字符串的过程我们跳过计时，因为json序列化已经在前一个场景测试结束了 ↑↑↑

	startTime := time.Now()
	for i := 0; i < 10; i++ {
		if resp, err = jsonDecode(jsString); err != nil {
			fmt.Println(err.Error())
		}
	}

	fmt.Printf("json字符串反序列化后信息——code：%d, msg:%s, listLen: %d\n", resp.Code, resp.Msg, len(resp.List))
	fmt.Println("100万个对象(Stu) json 文本反序列化，单次平均耗时(ms)：", time.Now().Sub(startTime).Milliseconds()/10)
}

type Response struct {
	Code int    `json:"code"`
	Msg  string `json:"msg"`
	List []Stu  `json:"list"`
}

type Stu struct {
	Name  string
	Sex   int
	Age   int
	Score float32
}

func InitStu(num int, stuSlice []Stu) {
	for i := 0; i < num; i++ {
		var tmpStu = Stu{userNamePre + strconv.Itoa(i), i % 2, ageBase + i, scoreBase + float32(i)}
		stuSlice[i] = tmpStu
	}
}
func jsonEncode(list []Stu) string {
	resp := Response{
		Code: 200,
		Msg:  "成功",
		List: list,
	}

	if bytes, err := json.Marshal(resp); err == nil {
		return string(bytes)
	}
	return ""
}

// 将 json字符串反序列化(还原)为普通的结构体
func jsonDecode(jsonStr string) (resp Response, err error) {
	err = json.Unmarshal([]byte(jsonStr), &resp)
	return
}
